package com.github.tomakehurst.wiremock.db.mapper;

import com.github.tomakehurst.wiremock.db.entity.WireMockJournal;
import com.github.tomakehurst.wiremock.db.entity.WireMockJournalDetails;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface WireMockJournalMapper {

    /**
     * 插入请求日志主表记录
     * @param wireMockJournal 主表实体
     */
    void insertJournal(WireMockJournal wireMockJournal);

    /**
     * 插入请求日志详情表记录
     * @param details 详情表实体
     */
    void insertJournalDetails(WireMockJournalDetails details);

    /**
     * 根据 ID 查询请求日志（关联详情表）
     * @param id 日志 ID
     * @return 包含详情的请求日志实体
     */
    WireMockJournal selectJournalWithDetails(@Param("id") String id);

    /**
     * 查询所有请求日志（主表）
     * @return 主表实体列表
     */
    List<WireMockJournal> selectAllJournals();

    /**
     * 根据主表 ID 查询详情表记录
     * @param journalId 主表 ID
     * @return 详情表实体
     */
    WireMockJournalDetails selectJournalDetailsByJournalId(@Param("journalId") String journalId);

    // 可根据需要扩展其他方法，如分页查询、条件查询等
    // --------------------------
    // 新增方法：支持 DbRequestJournalStore 完整功能
    // --------------------------

    /**
     * 查询最旧日志的主表 ID（用于 removeLast()）
     * @return 最旧日志的 ID（按创建时间升序取第一条）
     */
    String selectOldestJournalId();

    /**
     * 按 ID 删除主表记录（用于 remove() 和 clear()）
     * @param id 主表 ID
     */
    void deleteJournalById(@Param("id") String id);

    /**
     * 按主表 ID 删除详情表记录（用于 remove() 和 clear()）
     * @param journalId 主表 ID
     */
    void deleteJournalDetailsByJournalId(@Param("journalId") String journalId);

    /**
     * 更新主表记录（用于 put()）
     * @param wireMockJournal 主表实体（含更新后的数据）
     */
    void updateJournal(WireMockJournal wireMockJournal);

    /**
     * 更新详情表记录（用于 put()）
     * @param details 详情表实体（含更新后的数据）
     */
    void updateJournalDetails(WireMockJournalDetails details);

    /**
     * 清空主表所有记录（用于 clear()）
     */
    void truncateJournal();

    /**
     * 清空详情表所有记录（用于 clear()）
     */
    void truncateJournalDetails();
}